package com.kurumi.util;

import java.io.OutputStream;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.util.CellRangeAddress;


/**
 * ExcelUtil
 * @author lyh
 *
 */
public class ExcelUtils {

	public static void exportExcel(OutputStream out, String title,List<String> headers,List<String> keys, List<Map<String, String>> records) {

		try {

			// 创建一个工作薄
			HSSFWorkbook workbook = new HSSFWorkbook();
			// 创建一个sheet页
			HSSFSheet sheet = workbook.createSheet();
			// 设置sheet页的列宽
			sheet.setDefaultColumnWidth(20);

			// 设置标题样式
			HSSFCellStyle titleStyle = workbook.createCellStyle();
			// 设置字体居中显示
			//titleStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
			// 设置标题字体
			HSSFFont titleFont = workbook.createFont();
			titleFont.setFontHeightInPoints((short) 25);
			titleStyle.setFont(titleFont);

			// 产生标题
			HSSFRow row = sheet.createRow(0);
			HSSFCell cell = row.createCell(0);
			cell.setCellStyle(titleStyle);
			cell.setCellValue(title);
			// 合并单元格
			sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, headers.size() - 1));

			// 表头样式
			HSSFCellStyle headStyle = workbook.createCellStyle();
			//headStyle.setFillForegroundColor(HSSFColor.WHITE.index);
			// 设置填充模式
			//headStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);

			// 设置字体居中
			//headStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
			//headStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
			//headStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
			//headStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
			//headStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);
			// 设置字体样式
			HSSFFont headFont = workbook.createFont();
			//headFont.setColor(HSSFColor.BLACK.index);
			//headFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);// 设置字体粗细
			headFont.setFontHeightInPoints((short) 16);
			headStyle.setFont(headFont);
			
			HSSFCellStyle rowStyle = workbook.createCellStyle();
			//rowStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
			//rowStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
			//rowStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
			//rowStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);
			//rowStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
			// 创建第二行，生成表格的表头行
			row = sheet.createRow(1);// 第二行
			for (int i = 0; i < headers.size(); i++) {
				cell = row.createCell(i);// 从第一列开始
				cell.setCellStyle(headStyle);// 设置列的样式
				cell.setCellValue(headers.get(i));
			}
			int i = 0;
			for (Map<String, String> record : records) {
				row = sheet.createRow(2 + i);// 从第三行去写数据
				
				for(int colIndex = 0; colIndex < keys.size(); colIndex++){
					cell = row.createCell(colIndex);
					cell.setCellStyle(rowStyle);// 设置列的样式
					String value = record.get(keys.get(colIndex));
					cell.setCellValue(value);
					
				}
				i++;
			}

			workbook.write(out);

		} catch (Exception e) {
			e.printStackTrace();
		}

	}
	
	
	public static void exportExcel(OutputStream out,List<String> headers,List<String> keys, List<Map<String, String>> records) {

		try {

			// 创建一个工作薄
			HSSFWorkbook workbook = new HSSFWorkbook();
			// 创建一个sheet页
			HSSFSheet sheet = workbook.createSheet();
			// 设置sheet页的列宽
			sheet.setDefaultColumnWidth(20);

			// 设置标题样式
			HSSFCellStyle titleStyle = workbook.createCellStyle();
			// 设置字体居中显示
			//titleStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
			// 设置标题字体
			HSSFFont titleFont = workbook.createFont();
			titleFont.setFontHeightInPoints((short) 25);
			titleStyle.setFont(titleFont);
			// 表头样式
			HSSFCellStyle headStyle = workbook.createCellStyle();
			//headStyle.setFillForegroundColor(HSSFColor.WHITE.index);
			// 设置填充模式
			//headStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);

			// 设置字体居中
			//headStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
			//headStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
			//headStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
			//headStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
			//headStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);
			// 设置字体样式
			HSSFFont headFont = workbook.createFont();
			//headFont.setColor(HSSFColor.BLACK.index);
			//headFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);// 设置字体粗细
			headFont.setFontHeightInPoints((short) 16);
			headStyle.setFont(headFont);
			
			HSSFCellStyle rowStyle = workbook.createCellStyle();
			//rowStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
			//rowStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
			//rowStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
			//rowStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);
			//rowStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
			// 创建第一行，生成表格的表头行
			HSSFRow row = sheet.createRow(0);// 第一行
			HSSFCell cell = null;
			for (int i = 0; i < headers.size(); i++) {
				cell = row.createCell(i);// 从第一列开始
				cell.setCellStyle(headStyle);// 设置列的样式
				cell.setCellValue(headers.get(i));
			}
			int i = 0;
			for (Map<String, String> record : records) {
				row = sheet.createRow(1 + i);// 从第二行去写数据
				
				for(int colIndex = 0; colIndex < keys.size(); colIndex++){
					cell = row.createCell(colIndex);
					cell.setCellStyle(rowStyle);// 设置列的样式
					String value = record.get(keys.get(colIndex));
					cell.setCellValue(value);
					
				}
				i++;
			}

			workbook.write(out);

		} catch (Exception e) {
			e.printStackTrace();
		}

	}
	
	
	public static void exportExcel1(OutputStream out,List<String> headers,List<String> keys, List<Map<String, String>> records) {

		try {

			// 创建一个工作薄
			HSSFWorkbook workbook = new HSSFWorkbook();
			// 创建一个sheet页
			HSSFSheet sheet = workbook.createSheet();

			// 创建第一行，生成表格的表头行
			HSSFRow row = sheet.createRow(0);// 第一行
			HSSFCell cell = null;
			for (int i = 0; i < headers.size(); i++) {
				cell = row.createCell(i);// 从第一列开始
				cell.setCellValue(headers.get(i));
			}
			int i = 0;
			for (Map<String, String> record : records) {
				row = sheet.createRow(1 + i);// 从第二行去写数据
				
				for(int colIndex = 0; colIndex < keys.size(); colIndex++){
					cell = row.createCell(colIndex);
					String value = record.get(keys.get(colIndex));
					cell.setCellValue(value);
					
				}
				i++;
			}

			workbook.write(out);

		} catch (Exception e) {
			e.printStackTrace();
		}

	}
	
//	public static String getStringValue(Cell cell){
//		String value =null;
//		switch (cell.getCellType()) {
//			case Cell.CELL_TYPE_STRING:// 字符串型
//				value = cell.getRichStringCellValue().getString();
//				break;
//			case Cell.CELL_TYPE_NUMERIC:// 数值型
//				if (org.apache.poi.ss.usermodel.DateUtil.isCellDateFormatted(cell)) { // 如果是date类型则 ，获取该cell的date值
//					value = cell.getDateCellValue().toString();
//				} else {// 纯数字
//					value = ""+cell.getNumericCellValue();
//				}
//				break;
//			case Cell.CELL_TYPE_BOOLEAN:// 布尔
//				value = ""+cell.getBooleanCellValue();
//				break;
//			case Cell.CELL_TYPE_FORMULA:// 公式型
//				break;
//			case Cell.CELL_TYPE_BLANK:// 空值
//				break;
//			case Cell.CELL_TYPE_ERROR: // 故障
//				break;
//			default:
//		}
//		return value;
//	}
	
	
	/**
	 * 从单元格中获取对应的值
	 * @param cell
	 * @return
	 */
//	public static String getStringValueByCell(Cell cell){
//		String value = null;
//		if(cell == null){
//			return value;
//		}
//		switch (cell.getCellType()) {
//			case Cell.CELL_TYPE_STRING:// 字符串型
//				value = cell.getRichStringCellValue().getString();
//				break;
//			case Cell.CELL_TYPE_NUMERIC:// 数值型
//				if (org.apache.poi.ss.usermodel.DateUtil.isCellDateFormatted(cell)) { // 如果是date类型则 ，获取该cell的date值
//					value = cell.getDateCellValue().toString();
//				} else {// 纯数字
//					value =new BigDecimal(cell.getNumericCellValue()).intValue()+"";
//				}
//				break;
//			case Cell.CELL_TYPE_BOOLEAN:// 布尔
//				value = ""+cell.getBooleanCellValue();
//				break;
//			case Cell.CELL_TYPE_FORMULA:// 公式型
//				break;
//			case Cell.CELL_TYPE_BLANK:// 空值
//				break;
//			case Cell.CELL_TYPE_ERROR: // 故障
//				break;
//			default:
//		}
//		return value;
//	}
	
	public static void setCellValue(Cell cell,Object obj){
		if(obj instanceof String){
			cell.setCellValue((String)obj);
		}else if(obj instanceof Date){
			cell.setCellValue(DateUtil.dateFormat((Date)obj));
		}else if(obj instanceof Integer){
			cell.setCellValue(""+(Integer)obj);
		}else if(obj instanceof Float){
			cell.setCellValue(NumberUtils.getString(new BigDecimal(""+(Float)obj), 2));
		}else if(obj instanceof Long){
			if(!Float.isNaN((Long)obj)){
				cell.setCellValue(NumberUtils.getString(new BigDecimal(""+(Long)obj), 2));
			}
			
		}else if(obj instanceof Double){
			if(!Double.isNaN((Double)obj)){
				cell.setCellValue(NumberUtils.getString(new BigDecimal(""+(Double)obj), 2));
			}
			
		}else if(obj instanceof BigDecimal){
			cell.setCellValue(NumberUtils.getString((BigDecimal)obj, 2));
		}else if(obj instanceof List){
			cell.setCellValue(String.join(";", (List)obj));
		}
	}
}
